#ifndef PBIRSM_HPP
#define PBIRSM_HPP

#include "ap_int.h"
#include "hls_stream.h"
#include "hr_tbr.hpp" // 需要此文件来获取 raster_params_packet_fixed 的定义

// -----------------------------------------------------------
// 定义 PBIRSM 模块数据传输的常量
// -----------------------------------------------------------
// DDR AXI Master 的数据位宽
const int AXI_STREAM_WORD_BITS = 64; 

// 字段列表和在 DDR 中的占用字数：
// - 6 * fp_coord_t (每个 64 位，对应 1 个 ddr_word_t) = 6 words
// - 3 * fp_z_buffer_t (每个 16 位，占用 1 个 ddr_word_t) = 3 words
// - 9 * fp_coord_t (每个 64 位，对应 1 个 ddr_word_t) = 9 words
// - 2 * fp_coord_t (每个 64 位，对应 1 个 ddr_word_t) = 2 words
// - 3 * fp_color_channel_t (每个 8 位，占用 1 个 ddr_word_t) = 3 words
//
// 总计：6 + 3 + 9 + 2 + 3 = 23 words
const int NUM_AXI_WORDS_PER_PACKET = 23; 
// 一个 raster_params_packet_fixed 结构体在 DDR 中占用的总位宽
const int ACTUAL_RASTER_PARAMS_BITS = NUM_AXI_WORDS_PER_PACKET * AXI_STREAM_WORD_BITS; // 23 * 64 = 1472 bits

const int PACKED_RASTER_PARAMS_BITS = ACTUAL_RASTER_PARAMS_BITS;


// -----------------------------------------------------------
// DDR AXI Master 接口使用的 64 位数据类型
// -----------------------------------------------------------
typedef ap_uint<AXI_STREAM_WORD_BITS> ddr_word_t; // 用于从DDR读取参数的 64 位字


// -----------------------------------------------------------
// PBIRSM 模块的主HLS函数声明
// 职责：从DDR读取三角形参数，并流式输出给HR模块
// -----------------------------------------------------------
void parameter_buffer_interface_and_raster_setup(
    // 指向DDR中三角形参数缓冲区的 64 位 AXI Master
    // HLS 会为这个指针生成一个 AXI-Lite 寄存器用于 PS 配置基地址，并使用它驱动 M_AXI 端口
    ddr_word_t* params_buffer_base_addr, 
    hls::stream<raster_params_packet_fixed>& output_raster_params_stream, // 输出到HR模块的三角形参数流
    // num_triangles_to_process 的类型 (ap_uint<16>) 已经足够容纳 511
    const ap_uint<16> num_triangles_to_process // 本帧需要处理的三角形数量，由PS写入
);

#endif // PBIRSM_HPP
